﻿namespace game
{
    class Program
    {
        static List<NPC> npcs = [];
        static 工具 工具类 = new();

        static void Main()
        {
            工具类.LoadNpcs(ref npcs);

            while (true)
            {
                Console.Clear();
                Console.WriteLine("战斗！！ \n");
                Console.WriteLine(
               "1 退出程序 \n" +
               "2 建立角色 \n" +
               "3 打印角色 \n" +
               "4 战斗 \n" +
               "5 备战 \n");

                switch (Console.ReadLine())
                {
                    case "1"://退出程序
                        工具类.SaveNpcs(npcs);
                        return;

                    case "2"://建立角色
                        NewNpc();
                        工具类.SaveNpcs(npcs);
                        break;

                    case "3"://打印角色
                        PrintNpc(-1);
                        Console.ReadLine();
                        break;

                    case "4"://战斗
                        Fight();
                        工具类.SaveNpcs(npcs);
                        break;


                    case "5"://备战
                        if (!PrintNpc(-1))
                        {
                            Console.ReadLine();
                            break;
                        }
                        Console.WriteLine("请选择备战角色编号：");
                        int _角色 = 工具类.选择角色(npcs, false);
                        PrintNpc(_角色);

                        NPC A = npcs[_角色];
                        工具类.备战(ref A);
                        npcs[_角色] = A;
                        break;

                    default:
                        Console.WriteLine("输入错误，请重新输入");
                        Thread.Sleep(200);
                        break;
                }
            }
        }
        //新建角色
        static void NewNpc()
        {
            int new_c, new_d;
            bool new_b;
            string new_a;

            Console.WriteLine("请输入名字：");
            new_a = "" + Console.ReadLine();

            #region 性别
            Console.WriteLine("请输入性别： a 男   b 女");

        _xb1:
            switch (Console.ReadLine())
            {
                case "a":
                    new_b = true;
                    Console.WriteLine("设置为男性");
                    break;
                case "b":
                    new_b = false;
                    Console.WriteLine("设置为女性");
                    break;
                default:
                    Console.WriteLine("输入错误，请重新输入");
                    goto _xb1;
            }
        #endregion

        #region 年龄

        年龄:
            Console.WriteLine("请输入年龄：");
            try //主要防止输入非数字
            {
                new_c = int.Parse("" + Console.ReadLine());

                if (new_c <= 0)
                {
                    Console.WriteLine("年龄不能为0或负数");
                    goto 年龄;
                }
                else if (new_c > 500)
                {
                    Console.WriteLine("年级大了，就不要打打杀杀啦");
                    goto 年龄;
                }
                else
                {
                    Console.WriteLine("年龄设置为" + new_c);
                }
            }
            catch (Exception)
            {

                Console.WriteLine("请输入纯数字");
                goto 年龄;
            }

        #endregion

        #region 攻击
        攻击:
            Console.WriteLine("请输入攻击力：");
            try //主要防止输入非数字
            {
                new_d = int.Parse("" + Console.ReadLine());
                if (new_d <= 0)
                {
                    Console.WriteLine("攻击力不能为0或负数");
                    goto 攻击;
                }
                else if (new_d > 90)
                {
                    Console.WriteLine("攻击力太高了，给留条活路吧");
                    goto 攻击;
                }
                else
                {
                    Console.WriteLine("攻击力设置为" + new_d);
                }
            }
            catch (Exception)
            {
                Console.WriteLine("请输入纯数字");
                goto 攻击;
            }

            #endregion

            NPC newNpc = new();
            newNpc.WriteNpc(new_a, new_b, new_c, new_d);
            npcs.Add(newNpc);
        }

        /// <summary>
        /// 打印角色详细信息 （成功返回TRUE 否则 false）
        /// </summary>
        /// <param name="编号">-1打印所有，否则打印编号</param>
        static bool PrintNpc(int 编号)
        {
            //如果编号小于0 则打印所有已有角色
            if (编号 < 0)
            {

                //如果当前没有角色则返回 False
                if (npcs.Count == 0)
                {
                    Console.WriteLine("没有角色！");
                    return false;
                }

                Console.WriteLine("当前角色：\n");
                foreach (var npc in npcs)
                {
                    Console.WriteLine("名字：" + npc.Name);
                    string _xb = npc.Gender ? "男" : "女";
                    Console.WriteLine("性别：" + _xb);
                    Console.WriteLine("年龄：" + npc.Age);
                    Console.WriteLine("攻击：" + npc.GongJi);
                    Console.WriteLine("血量：" + npc.HP);
                    Console.WriteLine("经验：" + npc.Experience);
                    Console.WriteLine("等级：" + npc.Level);
                    Console.WriteLine("药水：" + npc.HealthPotion);
                    Console.WriteLine();
                }
            }
            //如果传入编号大于0 则打印编号对应的角色信息
            else
            {
                Console.WriteLine("名字：" + npcs[编号].Name);
                string _xb = npcs[编号].Gender ? "男" : "女";
                Console.WriteLine("性别：" + _xb);
                Console.WriteLine("年龄：" + npcs[编号].Age);
                Console.WriteLine("攻击：" + npcs[编号].GongJi);
                Console.WriteLine("血量：" + npcs[编号].HP);
                Console.WriteLine("经验：" + npcs[编号].Experience);
                Console.WriteLine("等级：" + npcs[编号].Level);
                Console.WriteLine("药水：" + npcs[编号].HealthPotion);
                Console.WriteLine();
            }
            //成功遍历左右角色或打印对应编号角色则返回True
            return true;
        }
        //战斗
        static void Fight()
        {

            #region 选择角色
            // 判断大于两个角色才能进行战斗
            if (npcs.Count < 2)
            {
                Console.WriteLine("需要至少两个角色才能进行战斗！");
                Console.ReadLine();
                return;
            }

            Console.WriteLine("选择第一个角色进行战斗（输入编号）：");

            int 主动 = 工具类.选择角色(npcs, true);

            Console.WriteLine("选择第二个角色进行战斗（输入编号）：");

        防止重复:
            int 被动 = 工具类.选择角色(npcs, true);
            if (被动 == 主动)
            {
                Console.WriteLine("怎么舍得自己打自己，请重新输入：");
                goto 防止重复;
            }

            #endregion

            // 回合制战斗
            while (npcs[主动].HP > 0 && npcs[被动].HP > 0)
            {
                if (npcs[主动].Fight(npcs[被动]))
                {
                    break; // 如果逃跑了，则结束战斗
                }

                Console.WriteLine();
                Thread.Sleep(1000);

                if (npcs[被动].HP > 0)
                {
                    if (npcs[被动].Fight(npcs[主动]))
                    {
                        break; // 如果逃跑了，则结束战斗
                    }
                }

                Console.WriteLine();
                Thread.Sleep(1000);
            }

            if (npcs[主动].HP <= 0 || npcs[被动].HP <= 0)
            {
                // 战斗结束后，获胜者获得经验
                if (npcs[主动].HP > npcs[被动].HP)
                    npcs[主动].GainExperience(10);
                else
                    npcs[被动].GainExperience(10);
            }
            else
            {
                Console.WriteLine("对手偷偷逃跑了！本次无经验加成");
            }
            Console.ReadLine();
        }
    }
}